文本的立体解析,用一个或数个变量逐行进行,可以理解为行列式、二维数组、字段记录的关系数据、excel数据列;文本可来源于文件、文本串或命令的输出;
/F parsing file content and command output or text;
for /f "tokens=*" %%a in ('dir') do ( command[command-parameters])
for循环语句用于分析"dir"命令所显示的字符串,"/f"参数表示for语句以解析方式工作。For语句首先执行括号中"dir"命令,然后进入for语句块执行相应的命令。"tokens"参数只有一个"*",表示"%%a"将依次代表"dir"命令输出的每一行。For语句循环次数等于"dir"命令显示结果的行数。
格式说明1
FOR /F ["options useabckq"] %variable IN ("file-set") DO command [command-parameters]
FOR /F ["options"] %variable IN ('string') DO command [command-parameters]
FOR /F ["options"] %variable IN (`command`) DO command [command-parameters](注意符号是`,esc 下的符号)
fileset 为一个或多个文件名(以空格分隔)。继续到 fileset 中的下一个文件之前,每份文件都被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,忽略空行,然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环.
格式说明2
for /f ["optins"] %%var in ("file-set") do command[command-parameters]
for /f ["optins"] %%var in ('string') do command[command-parameters]
for /f ["optins"] %%var in (`command`) do command[command-parameters]
如果"optins"指定的选项中包含usebackq,则filename为一个或多个文件名.继续到filenameset中的下一个文件之前,每份文件都已被打开,读取并经过处理.处理包括读取文件,将其分成单行的文字,然后将每行解析成符号.然后用已找到的符号字符串变量值调用for循环.
默认情况下,/f通过每个文件的每一行中分开的第一个空白符号.路过空白行.
用户可以通过指定可选"optins"参数替代默认解析操作.这个带引号的字符串可以包括一个或多个指定不同解析选项的关键字:
格式说明3
for /f ["options"] %%var in (source) do statement
options用于设置文本匹配选项;
source指定了文本的来源;
statement 指定了在文本匹配时要执行的操作;
source中的每一行文本被当做一个记录进行处理,不同的字段由特定的字符分隔开(默认的分隔符是制表符和空格);
例1
for /f "eol=; tokens=2,3* delims=, " %%i in (coolpen.txt) do @echo %i %j %k
/f 该语句会分析coolpen.txt中的每一行,
eol=; 忽略以;打头的那些行;
tokens=2,3*将每行的第二个和第三个符号传递给for函数体;即截取第二列、第三列、第三列后面的列,第二列由%%i表示,第三列由i的下一个字母k,即变量%%j表示,剩下的部分下%%k表示;
delims=,用逗号和空格分隔符号.
对于带有空格的文件名,用户需要用双括号将文件名括起来.为了用这种方式来使用双引号,还需要使用usebackq选项,否则,双引用会被理解成是用作定义某个要分析的字符串;
%i是for语句中的声明,%j,%k是通过tokens=选项隐式声明的.可以通过tokens=一行指定最多26个符号,
for变量是一个单一字母,分大小写和全局的变量;
例2
如有一个文本文档wwu.txt,其内容是:wu wanqun w\h staff wwuhn@hotmail.com 13725317945
如果将该行看成一个记录,可以划分为6个字段;
for /f "tokens=1-6" %%a in (wwu.txt) do (@echo name: %%a %%b department: %%c place: %%d email: %%e tel: %%f
该命令指定了要处理的前6个字段,分别由%%A代表第一个字段,依次下次;
eol:设置行尾注注释字段,此外的所有数据都被命令看成注释;
tokens:为每一源行设置令牌字段,默认情况下,只对第一个令牌进行检查;
usebackq:规定可以在源指定符号中使用引号,也就是in ()这一部分:对文件名使用双引号,对命令使用反引号(即反引号用于封装命令,与~现一个键);对字符串封装用单引号;
tokens:*:把一行当作整体处理,而不分割为字段;
option:可以是以下的一个或多个组合;
以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。
您可通过指定可选 "options" 参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。这些关键字为:
关于行的选项
tokens:*:把一行当作整体处理,而不分割为字段;
token fields sparated by spaces or tabs by default
eol=c:指定一个行注释字符的结尾(仅一个);
eol=c - 指一个行注释字符的结尾(就一个)(忽略指定字符开头的行);
skip=n:在文件开始时忽略的行数;
skip=n - 指在文件开始时忽略的行数。
关于列或字段的选项
lelims=xxx:指定分隔符集.这个替换了空格和跳格键的默认分隔符集;
delims=xxx - 指分隔符集。这个替换了空格和跳格键的 默认分隔符集。可以是多个,以空格分隔,如果包括空格,要放置到最后;如果不考虑空格,则"delims="
tokens=x,y,m-n:指每行的哪一个符号被传递到每个迭代的for本身.这会导致额外变量名称的分配.m-n格式为一个范围.
token:表示, 向征, 记号, 代币
delimit定界限, 划界
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。m-n格式为一个范围。通过 nth 符号指定 mth。如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
通俗地说,是指筛选列号,每行的文本通过分隔符delims分隔后,会生成若干列,这些列可以筛选使用,如果假设用分隔符分隔出了9列,用tokens指定的3列,在命令中使用的变量是%d,则还会扩充3-1个变量迭代其余两列(%d只表示tokens首先指定的列;最后的结果是形成一个行列式,或二维数组;行数=总行数-空行-eol-skip;列数是由tokens指定的列数,指定了n列则有有%variable开始的n个变量来表示,每个变量的可能值的个数则是行数;
usebackq - 指定新语法已在下类情况中使用:在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 file-set中使用双引号扩起文件名称。